Spring JDBC-তে RowMapper এবং BeanPropertyRowMapper হল দুটি গুরুত্বপূর্ণ ইন্টারফেস/ক্লাস, যেগুলি ডাটাবেস থেকে প্রাপ্ত ResultSet-কে জাভার অবজেক্টে ম্যাপ করতে ব্যবহৃত হয়। এগুলি ডেটাবেস থেকে ডেটা পড়া এবং সেটিকে সহজেই প্রাসঙ্গিক জাভা অবজেক্টে রূপান্তর করতে সাহায্য করে।
RowMapper একটি ইন্টারফেস যা ResultSet-এর প্রতিটি রো (row) প্রসেস করতে ব্যবহৃত হয়। এটি ডেভেলপারদের কাস্টম অবজেক্ট ম্যাপিংয়ের ক্ষমতা দেয়।
public interface RowMapper<T> {
T mapRow(ResultSet rs, int rowNum) throws SQLException;
}
ধরা যাক আমাদের একটি টেবিল users
আছে যার কলাম: id
, name
, email
। আমরা চাই এগুলো একটি User
ক্লাসে ম্যাপ করতে।
public class User {
private int id;
private String name;
private String email;
// Getters and Setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;
public class UserRowMapper implements RowMapper<User> {
@Override
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setEmail(rs.getString("email"));
return user;
}
}
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import java.util.List;
public class RowMapperExample {
public static void main(String[] args) {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/your_database");
dataSource.setUsername("your_username");
dataSource.setPassword("your_password");
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
String query = "SELECT * FROM users";
List<User> users = jdbcTemplate.query(query, new UserRowMapper());
for (User user : users) {
System.out.println("User ID: " + user.getId());
System.out.println("User Name: " + user.getName());
System.out.println("User Email: " + user.getEmail());
}
}
}
BeanPropertyRowMapper হল একটি প্রস্তুত তৈরি ক্লাস, যা ResultSet-এর রো সরাসরি জাভা অবজেক্টে রূপান্তর করতে ব্যবহৃত হয়। এটি RowMapper-এর একটি ইমপ্লিমেন্টেশন, এবং এর সুবিধা হল এটি স্বয়ংক্রিয়ভাবে ResultSet-এর কলামের নাম এবং জাভা অবজেক্টের প্রপার্টির মধ্যে নাম মিলিয়ে ডেটা ম্যাপ করে।
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import java.util.List;
public class BeanPropertyRowMapperExample {
public static void main(String[] args) {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/your_database");
dataSource.setUsername("your_username");
dataSource.setPassword("your_password");
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
String query = "SELECT * FROM users";
List<User> users = jdbcTemplate.query(query, new BeanPropertyRowMapper<>(User.class));
for (User user : users) {
System.out.println("User ID: " + user.getId());
System.out.println("User Name: " + user.getName());
System.out.println("User Email: " + user.getEmail());
}
}
}
বৈশিষ্ট্য | RowMapper | BeanPropertyRowMapper |
---|---|---|
কাস্টম ম্যাপিং | কাস্টমাইজ করা যায় (ম্যাপিং নিয়ন্ত্রণ করা যায়) | স্বয়ংক্রিয়ভাবে ম্যাপিং করা হয়। |
অতিরিক্ত কোড প্রয়োজন | কাস্টম RowMapper ইমপ্লিমেন্ট করতে হয়। | সরাসরি ব্যবহারযোগ্য। |
নাম মিলানো (Name Matching) | প্রোগ্রামার নিয়ন্ত্রণ করতে পারে। | কলামের নাম এবং ফিল্ডের নাম একই হতে হবে। |
সহজতা | বড় এবং জটিল ম্যাপিংয়ের জন্য ভালো। | সহজ এবং সরল ডেটা ম্যাপিংয়ের জন্য উপযুক্ত। |
উপরের উদাহরণগুলো Spring JDBC-এর RowMapper এবং BeanPropertyRowMapper সম্পর্কে পরিষ্কার ধারণা দেবে।
RowMapper হল Spring Framework এর একটি ইন্টারফেস যা ডেটাবেস টেবিলের একটি রো (row) কে জাভা অবজেক্টে রূপান্তর করতে ব্যবহৃত হয়। এটি org.springframework.jdbc.core.RowMapper
প্যাকেজের অন্তর্ভুক্ত।
RowMapper ইন্টারফেসটি একটি একক মেথড প্রদান করে:
T mapRow(ResultSet rs, int rowNum) throws SQLException;
ResultSet
: ডেটাবেস থেকে প্রাপ্ত রো এর ডেটা ধারণ করে।rowNum
: রো এর ইনডেক্স।T
: রিটার্ন টাইপ যা ডেভেলপার নির্ধারণ করে।ResultSet
প্রসেসিং এড়িয়ে যায়।ResultSet
হ্যান্ডলিং কোড লেখার প্রয়োজন হয় না, যা কোডকে ছোট এবং পরিষ্কার রাখে।ডেটাবেস থেকে User
অবজেক্ট তৈরি করার জন্য একটি RowMapper ইমপ্লিমেন্টেশন:
import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;
public class UserRowMapper implements RowMapper<User> {
@Override
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setEmail(rs.getString("email"));
return user;
}
}
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.List;
public class UserDao {
private JdbcTemplate jdbcTemplate;
public UserDao(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public List<User> getAllUsers() {
String sql = "SELECT id, name, email FROM users";
return jdbcTemplate.query(sql, new UserRowMapper());
}
}
RowMapper ইন্টারফেস সরাসরি ল্যাম্বডা এক্সপ্রেশন বা অ্যানোনিমাস ক্লাস ব্যবহার করেও ইমপ্লিমেন্ট করা যায়:
public List<User> getAllUsers() {
String sql = "SELECT id, name, email FROM users";
return jdbcTemplate.query(sql, (rs, rowNum) -> {
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setEmail(rs.getString("email"));
return user;
});
}
ResultSet
হ্যান্ডলিং এর জন্য বারবার কোড লেখার প্রয়োজন হয় না।RowMapper
ব্যবহার করে ডেটাবেস অপারেশন আরও সুসংগঠিত হয়।Spring JDBC এর RowMapper একটি শক্তিশালী টুল যা ডেটাবেস রো-কে জাভা অবজেক্টে রূপান্তর করার কাজকে সহজ, দ্রুত এবং কার্যকরী করে তোলে। এটি ডেটাবেস অপারেশনকে আরও রিডেবল এবং পুনঃব্যবহারযোগ্য করে তোলে, যা ডেভেলপারদের ডেটাবেস ইন্টিগ্রেশন সহজ করতে সাহায্য করে।
RowMapper
ইন্টারফেসটি স্প্রিং JDBC-তে একটি শক্তিশালী টুল যা ডাটাবেস থেকে প্রাপ্ত ResultSet
-এর প্রতিটি রো (row) ম্যাপ করে জাভা অবজেক্টে রূপান্তরিত করতে ব্যবহৃত হয়। আপনি যখন ডেটাবেস থেকে কাস্টম অবজেক্ট তৈরি করতে চান, তখন RowMapper
-এর সাহায্যে একটি কাস্টম ম্যাপিং লজিক তৈরি করা হয়।
mapRow
মেথড ওভাররাইড করে ম্যাপিং লজিক লিখতে হবে।ResultSet
থেকে ডেটা নিয়ে জাভা অবজেক্ট তৈরি করতে হবে।ধরা যাক, আমাদের একটি employees
নামের টেবিল আছে।
টেবিলের স্ট্রাকচার:
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(100),
department VARCHAR(50),
salary DECIMAL(10, 2)
);
public class Employee {
private int id;
private String name;
private String department;
private double salary;
// Getters and Setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;
public class EmployeeRowMapper implements RowMapper<Employee> {
@Override
public Employee mapRow(ResultSet rs, int rowNum) throws SQLException {
Employee employee = new Employee();
employee.setId(rs.getInt("id"));
employee.setName(rs.getString("name"));
employee.setDepartment(rs.getString("department"));
employee.setSalary(rs.getDouble("salary"));
return employee;
}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public class EmployeeDAO {
@Autowired
private JdbcTemplate jdbcTemplate;
public List<Employee> getAllEmployees() {
String sql = "SELECT * FROM employees";
return jdbcTemplate.query(sql, new EmployeeRowMapper());
}
}
আপনি চাইলে ফিল্টার করা ডেটা আনতে পারেন:
public Employee getEmployeeById(int id) {
String sql = "SELECT * FROM employees WHERE id = ?";
return jdbcTemplate.queryForObject(sql, new Object[]{id}, new EmployeeRowMapper());
}
ResultSet
প্রসেসিং লজিক সহজ করে এবং কোডের পড়তে সহজ হয়।RowMapper
স্প্রিং JDBC-তে একটি গুরুত্বপূর্ণ টুল যা ডেটা ম্যাপিংকে সহজ এবং কার্যকর করে তোলে। কাস্টম RowMapper ব্যবহার করে আপনি আপনার ডেটাবেস টেবিল এবং জাভা অবজেক্টের মধ্যে সম্পর্ক সুন্দরভাবে পরিচালনা করতে পারবেন। এটি কোড ক্লিন রাখার পাশাপাশি আপনার অ্যাপ্লিকেশনকে আরও মডুলার এবং পুনঃব্যবহারযোগ্য করে তোলে।
BeanPropertyRowMapper
হলো স্প্রিং জেডিবিসি এর একটি সুবিধাজনক ক্লাস, যা SQL ResultSet-এর কলামগুলোকে জাভা অবজেক্টের প্রপার্টি বা ফিল্ডের সাথে অটোম্যাটিক্যালি ম্যাপ করে। এটি RowMapper
ইন্টারফেসের একটি ইমপ্লিমেন্টেশন এবং POJO (Plain Old Java Object) ক্লাসের সাথে ডেটা ম্যাপিং সহজ করে তোলে।
BeanPropertyRowMapper
এগুলো অটোম্যাটিক্যালি ম্যাপ করে।ধরা যাক, আপনার একটি employee
টেবিল রয়েছে:
id | name | department | salary |
---|---|---|---|
1 | Alice | HR | 50000 |
2 | Bob | IT | 60000 |
public class Employee {
private int id;
private String name;
private String department;
private double salary;
// Getters and Setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.List;
public class EmployeeDAO {
private JdbcTemplate jdbcTemplate;
// Constructor Injection
public EmployeeDAO(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
// Fetch all employees
public List<Employee> getAllEmployees() {
String sql = "SELECT * FROM employee";
return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Employee.class));
}
// Fetch employee by ID
public Employee getEmployeeById(int id) {
String sql = "SELECT * FROM employee WHERE id = ?";
return jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(Employee.class), id);
}
}
query
মেথড:jdbcTemplate.query()
মেথড মাল্টিপল রেকর্ড রিটার্ন করার জন্য ব্যবহৃত হয়।BeanPropertyRowMapper<>(Employee.class)
POJO ক্লাসে ডেটা ম্যাপ করার জন্য ব্যবহৃত হয়।queryForObject
মেথড:যদি টেবিলের কলাম নাম এবং POJO প্রপার্টি নাম ভিন্ন হয়, তবে SQL query-তে AS
alias ব্যবহার করতে হবে।
String sql = "SELECT id AS employeeId, name AS employeeName, department AS dept, salary FROM employee";
return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Employee.class));
এক্ষেত্রে, আপনার POJO ক্লাসের প্রপার্টি নাম employeeId
, employeeName
, এবং dept
হতে হবে।
BeanPropertyRowMapper
স্প্রিং জেডিবিসি-তে সহজ এবং দ্রুত ডেটা ম্যাপিং এর জন্য একটি কার্যকর উপায়। এটি বয়লারপ্লেট কোড কমিয়ে ডেভেলপমেন্টের সময় এবং জটিলতা উভয়ই হ্রাস করে।
RowMapper
স্প্রিং জেডিবিসি (Spring JDBC)-তে ব্যবহৃত একটি ইন্টারফেস, যা ডাটাবেস থেকে প্রাপ্ত রেকর্ডকে কাস্টম অবজেক্টে ম্যাপ করার জন্য ব্যবহৃত হয়। এটি ডেটাবেসের একটি রো-কে জাভা অবজেক্টে রূপান্তর করার জন্য খুবই কার্যকর।
@FunctionalInterface
public interface RowMapper<T> {
T mapRow(ResultSet rs, int rowNum) throws SQLException;
}
RowMapper
ইন্টারফেসের একটি mapRow()
মেথড আছে, যা ডাটাবেস থেকে প্রতিটি রেকর্ডকে প্রসেস করে এবং জাভা অবজেক্ট তৈরি করে।
RowMapper
ব্যবহার করে একটি টেবিল থেকে ডেটা পড়াধরুন, আমাদের একটি users
নামক টেবিল আছে:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
email VARCHAR(255)
);
public class User {
private int id;
private String name;
private String email;
// Constructor
public User(int id, String name, String email) {
this.id = id;
this.name = name;
this.email = email;
}
// Getters and Setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", email='" + email + '\'' +
'}';
}
}
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
@Service
public class UserService {
private final JdbcTemplate jdbcTemplate;
public UserService(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public List<User> getAllUsers() {
String sql = "SELECT * FROM users";
// Using RowMapper
return jdbcTemplate.query(sql, new RowMapper<User>() {
@Override
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
return new User(
rs.getInt("id"),
rs.getString("name"),
rs.getString("email")
);
}
});
}
}
Lambda
দিয়ে সহজ পদ্ধতিতে RowMapper:RowMapper-এর lambda
এক্সপ্রেশন ব্যবহার করা যেতে পারে:
public List<User> getAllUsers() {
String sql = "SELECT * FROM users";
return jdbcTemplate.query(sql, (rs, rowNum) -> new User(
rs.getInt("id"),
rs.getString("name"),
rs.getString("email")
));
}
ধরুন, আমরা একটি নির্দিষ্ট id
এর ভিত্তিতে User
পড়তে চাই:
public User getUserById(int id) {
String sql = "SELECT * FROM users WHERE id = ?";
return jdbcTemplate.queryForObject(sql, new Object[]{id}, (rs, rowNum) -> new User(
rs.getInt("id"),
rs.getString("name"),
rs.getString("email")
));
}
আপনার যদি একই টেবিলের জন্য বারবার RowMapper ব্যবহার করতে হয়, তাহলে কাস্টম RowMapper
তৈরি করুন:
import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;
public class CustomUserRowMapper implements RowMapper<User> {
@Override
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
return new User(
rs.getInt("id"),
rs.getString("name"),
rs.getString("email")
);
}
}
public List<User> getAllUsers() {
String sql = "SELECT * FROM users";
return jdbcTemplate.query(sql, new CustomUserRowMapper());
}
@SpringBootApplication
public class SpringJdbcExampleApplication {
public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(SpringJdbcExampleApplication.class, args);
UserService userService = context.getBean(UserService.class);
// Add some users
userService.addUser("Alice", "alice@example.com");
userService.addUser("Bob", "bob@example.com");
// Get all users
List<User> users = userService.getAllUsers();
users.forEach(System.out::println);
// Get user by ID
User user = userService.getUserById(1);
System.out.println(user);
}
}
RowMapper
-এর মাধ্যমে জাভা অবজেক্ট এবং ডাটাবেস টেবিলের রো-র মধ্যে ম্যাপিং সহজ হয়।RowMapper
তৈরি করে কোড আরও ক্লিন এবং মেইনটেইনেবল করা যায়।Read more